package com.cqc.jdk8.Jutil.concurrent;

import org.apache.commons.lang3.time.DateFormatUtils;
import org.junit.Test;

import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;

/**
 * @author cui
 * @date 2025/6/24 21:25
 * @description CyclicBarrier是屏障，当多个线程进行到屏障时，就无法往下走了，就像一堵墙挡着。
 * 只有所有的parties个线程都达到屏障是，屏障才撤销，线程继续往下走。
 * 底层使用  ReentrantLock Condition实现的
 **/
public class CyclicBarrierTest {

    public static void main(String[] args) {
        //参数与线程个数
        int parties = 3;
        CyclicBarrier cyclicBarrier = new CyclicBarrier(parties, new Runnable() {
            @Override
            public void run() {
                System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + "，所有进程都 达到屏障");
                //try {
                //    TimeUnit.SECONDS.sleep(2000);//加了，线程达到屏障后，就不往下走了
                //} catch (InterruptedException e) {
                //    e.printStackTrace();
                //}
                System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + "，所有进程都 准备就绪");
            }
        });

        for (int i = 0; i < parties; i++) {
            new Thread(() -> {
                System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + "，进程" + Thread.currentThread().getName() + "达到了屏障");
                try {
                    cyclicBarrier.await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + "，进程" + Thread.currentThread().getName() + "屏障解除，继续执行");
            }).start();
        }
    }

}
